package New;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * SimpleDateFormat是线程不安全的类，一般不要定义为static变量,如果定义为static变量，必须加锁
 * 或者使用DateUtils工具类
 *     private static final ThreadLocal <DateFormat> df = new ThreadLocal<DateFormat>(){
 *         @Override
 *         protected DateFormat initialValue() {
 *             return new SimpleDateFormat("yyyy-MM-dd");
 *         }
 *     };
 */
public class ThreadLocalDateUtils {
//    public  static   SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//    public static  Date parse(String stringDate) throws ParseException {
//       return sdf.parse(stringDate);
//   }
//  2.ThreadLocal可以确保每个线程都可以得到各自单独的一个SimpleDateFormat对象，就不会存在竞争问题了
   public static final ThreadLocal<SimpleDateFormat> sdfThreadLocal =ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    public static  final Date parseByThreadLocal(String stringDate) throws ParseException{
        return sdfThreadLocal.get().parse(stringDate);
    }
    public static void main(String[] args) throws ParseException {
//        System.out.println(simpleDateFormat.parse("2021-9-17 08:00:00"));
//        System.out.println(ThreadLocalDateUtils.parse("2021-11-11 11:11:11"));
        for (int i = 1; i <=5; i++) {
            new Thread(()->{
                try {
//                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//每一次new一个，可以，麻烦
//                    System.out.println(sdf.parse("2021-11-11 11:11:11"));
//                    sdf =null;
                    System.out.println(ThreadLocalDateUtils.parseByThreadLocal("2021-11-11 11:11:11"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }finally {
                sdfThreadLocal.remove();
                }
            },String.valueOf(i)).start();
        }
   }
}
